<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    //ES5类与继承
    //父类
    // function Person(name, age) {
    //   this.name = name
    //   this.age = age
    //   this.class = '人类'
    // }
    // //原型对象上的方法是给实例化对象使用的
    // Person.prototype.eat = function () {
    //   console.log('吃饭');
    // }

    // //子类
    // function Student(name, age, id) {
    //   //修改父类的this指向为子类的实例化对象构造函数继承
    //   Person.call(this, name, age)
    //   this.id = id
    // }
    // //原型链的继承
    // Student.prototype = new Person
    // //修正constructor
    // Student.prototype.constructor = Student

    // const s1 = new Student('xiaoming',11)
    // s1.eat()
    // console.log(s1.name);
    // console.log(s1.class);

    //ES6
    //父类
    class Person {
      //构造器函数,当类被实例化的时候,实例化对象会直接调用原型对象上的constructor方法
      constructor(name, age) {
        //实例化属性
        this.name = name
        this.age = age
        this.run = function () {
          console.log('会跑');
        }
      }
      //同样是给实例化对象添加方法
      eat = function () {
        console.log('会吃');
      }

      //给原型对象上添加方法
      say() {
        console.log('会说');
      }
      //给构造函数添加静态方法或者属性前面必须加static修饰
      static go = 'go'
    }
    //ES6子类
    class Student extends Person {
      //只要子类书写constructor,必须在constructor中调用super，因为子类没有自己的this,需要调用super来构建自己的this
      //如果子类没有constructor的话，子类的传参是直接给父类
      //如果子类有constructor的话,则子类的传参是传递给子类的constructor的
      constructor(name,age,id) {
        //super的参数是传递给父类constructor的
        super(name,age)
        this.id = id
      }
      study = '学习'
      sleep(){
        console.log('睡觉');
      }
    }
    const s1 = new Student('xiaoming',12,111)
    console.log(s1.run());
  </script>
</body>

</html>